package com.chlp.core.framework.service;

import com.chlp.core.framework.utils.Assist;
import com.chlp.core.framework.utils.MulTableQuery;

import java.util.HashMap;
import java.util.List;

/**
 * 业务service注入CommonCurdService 便可以实现通过实体对任意表的CRUD。一次注入随处调用。
 * <p>
 * 1.先通过工具生成实体.
 * 2.通过实体可以进行CRUD.
 * 3.如果没有生成实体也可以通过Assist构建SQL直接查询任意表.
 *
 * @author 陈礼鹏
 * @date 2020/1/16 17:23
 */
public interface CommonCurdService {

    /**
     * 通用分页查询
     *
     * @param entity 实体类，也可以是其他的bean
     * @param start  分页参数：开始查询的游标
     * @param length 分页参数：每页的数量
     * @return 返回分页数据, 返回的类型和请求的参数entity类型一致
     */
    MulTableQuery.Pagination<?> queryAnyTableByConditionPage(Object entity, int start, int length);

    /**
     * 通用分页查询
     *
     * @param entity 实体类，也可以是其他的bean
     * @param start  分页参数：开始查询的游标
     * @param length 分页参数：每页的数量
     * @return 返回分页数据, 返回的类型是：HashMap<String, Object>，返回的字段是由查询的字段决定的
     */
    MulTableQuery.Pagination<?> queryAnyTableReturnMapByConditionPage(Object entity, int start, int length);

    /**
     * 通用分页查询
     *
     * @param oneClass 实体类/必须对应表的实体
     * @param assist   SQL辅助类
     * @param start    分页参数：开始查询的游标
     * @param length   分页参数：每页的数量
     * @return 返回分页数据, 返回的类型和请求的参数oneClass类型一致
     */
    MulTableQuery.Pagination<?> queryAnyTableByConditionPage(Assist assist, Class<?> oneClass, int start, int length);

    /**
     * 通用分页查询
     *
     * @param assist SQL辅助类
     * @param start  分页参数：开始查询的游标
     * @param length 分页参数：每页的数量
     * @return 返回分页数据, 返回的类型是：HashMap<String, Object>，返回的字段是由查询的字段决定的
     */
    MulTableQuery.Pagination<?> queryAnyTableReturnMapByConditionPage(Assist assist, int start, int length);

    /**
     * 通用查询，不分页
     *
     * @param entity 实体类，也可以是其他的bean
     * @return 返回所有的数据, 返回的类型和请求的参数entity类型一致
     */
    List<?> queryAnyTableByCondition(Object entity);

    /**
     * 通用查询，只返回一个对象
     *
     * @param entity 实体类，也可以是其他的bean
     * @return 返回所有的数据, 返回的类型和请求的参数entity类型一致
     */
    Object queryOneAnyTableByCondition(Object entity);

    /**
     * 通用查询，不分页
     *
     * @param oneClass 实体类/必须对应表的实体
     * @param assist   SQL辅助类
     * @return 返回所有的数据, 返回的类型和请求的参数oneClass类型一致
     */
    List<?> queryAnyTableByCondition(Assist assist, Class<?> oneClass);

    /**
     * 通用查询，不分页,
     *
     * @param assist SQL辅助类
     * @return 返回所有的数据, 返回的结果是map集合
     */
    List<HashMap<String, Object>> queryAnyTableReturnMap(Assist assist);

    /**
     * 插入属性不为空的值
     *
     * @param entity 必须是数据库表对应的实体类
     * @return 返回自增的主键
     */
    int insertOne(Object entity);

    /**
     * 批量插入属性不为空的值
     *
     * @param entities 必须是数据库表对应的实体类
     */
    void insertList(List<Object> entities);

    /**
     * 根据实体属性不为null做为查询条件删除数据
     *
     * @param entity 必须是数据库表对应的实体类
     */
    void deleteByEntity(Object entity);

    /**
     * 根据实体id的值做为查询条件更新数据
     *
     * @param entity 必须是数据库表对应的实体类
     */
    void updateById(Object entity);

    /**
     * 根据实体属性不为null做为查询条件更新数据
     *
     * @param entity          需要更新的对象：必须是数据库表对应的实体类
     * @param conditionEntity 查询条件对象：必须是数据库表对应的实体类
     */
    void updateByEntity(Object entity, Object conditionEntity);
}
